// File: userDataEncryption.js

import crypto from 'crypto';
const ENCRYPTION_KEY = process.env.ENCRYPTION_KEY || 'default_secure_key_32_bytes_long!';

/**
 * 基于用户ID加密数据
 * @param {string} userId - 用户ID
 * @param {string} plaintext - 要加密的原始文本
 * @returns {string} 加密后的字符串(格式: iv:encryptedData)
 */
export function encryptForUser(userId, plaintext) {
    // 验证输入
    if (!userId || !plaintext) {
        throw new Error('必须提供用户ID和要加密的内容');
    }
    
    try {
        // 生成随机初始化向量(16字节)
        const iv = crypto.randomBytes(16);
        
        // 创建用户专属密钥
        const userKey = generateUserKey(userId);
        
        // 创建加密器
        const cipher = crypto.createCipheriv('aes-256-cbc', userKey, iv);
        
        // 加密数据
        let encrypted = cipher.update(plaintext, 'utf8', 'hex');
        encrypted += cipher.final('hex');
        
        // 返回格式: iv:encryptedData
        return `${iv.toString('hex')}:${encrypted}`;
    } catch (error) {
        console.error('用户数据加密失败:', error);
        throw new Error('加密用户数据时发生错误');
    }
}

/**
 * 基于用户ID解密数据
 * @param {string} userId - 用户ID
 * @param {string} ciphertext - 加密后的字符串(格式: iv:encryptedData)
 * @returns {string} 解密后的原始文本
 */
export function decryptForUser(userId, ciphertext) {
    // 验证输入
    if (!userId || !ciphertext) {
        throw new Error('必须提供用户ID和加密内容');
    }
    
    try {
        // 分割加密字符串
        const parts = ciphertext.split(':');
        if (parts.length !== 2) {
            throw new Error('无效的加密格式，应为 iv:encryptedData');
        }
        
        // 提取组件
        const iv = Buffer.from(parts[0], 'hex');
        const encryptedData = parts[1];
        
        // 创建用户专属密钥
        const userKey = generateUserKey(userId);
        
        // 创建解密器
        const decipher = crypto.createDecipheriv('aes-256-cbc', userKey, iv);
        
        // 解密数据
        let decrypted = decipher.update(encryptedData, 'hex', 'utf8');
        decrypted += decipher.final('utf8');
        
        return decrypted;
    } catch (error) {
        console.error('用户数据解密失败:', error);
        throw new Error('解密用户数据时发生错误。可能使用了错误用户ID');
    }
}

/**
 * 生成用户专属密钥
 * @param {string} userId - 用户ID
 * @returns {Buffer} 32字节加密密钥
 */
function generateUserKey(userId) {
    // 使用用户ID作为盐值增强安全性
    return crypto.pbkdf2Sync(
        ENCRYPTION_KEY, 
        userId, 
        10000, // 迭代次数
        32,    // 密钥长度(32字节=256位)
        'sha512'
    );
}

export function generateUsernameHash(username) {
    return crypto.createHash('sha256').update(username).digest('hex');
}

export function generateDataHash(data) {
    if (!data) return null;
    return crypto.createHash('sha256').update(data).digest('hex');
}
